home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / language / gemfsc18.lzh / AESSRC18.LZH / AESFUNCS / FRMEFLAG.C < prev    next >
C/C++ Source or Header  |  1992-04-06  |  8KB  |  230 lines

  1. /*****************************************************************************
  2.  *
  3.  ****************************************************************************/
  4.  
  5. #include <osbind.h>
  6. #include <stdarg.h>
  7. #include "gemfast.h"
  8. #include "frmtypes.h"
  9.  
  10. #ifndef NULL
  11.   #define NULL 0L
  12. #endif
  13.  
  14. #ifndef TRUE
  15.   #define  TRUE       1
  16.   #define  FALSE      0
  17. #endif
  18.  
  19. static char cant_flagit_alert[] = "[3]"
  20.     "[An error has occured with an"
  21.     "|item you selected or modified."
  22.     "|There are not enough system"
  23.     "|resources to flag the object"
  24.     "|and display the error message."
  25.     "][ Continue ]"
  26.     ;
  27.  
  28. static OBJECT msgtree[] = {
  29.     -1,  1,  1, G_BOX,  NONE,   SHADOWED, 0x00FF2100L, 0, 0, 0, 0,
  30.      0,  2, 21, G_BOX,  NONE,   NORMAL,   0x00000000L, 1, 0, 0, 0,
  31.      3, -1, -1, G_TEXT, NONE,   NORMAL,   0L,          0, 0, 0, 1,
  32.      4, -1, -1, G_TEXT, NONE,   NORMAL,   0L,          0, 1, 0, 1,
  33.      5, -1, -1, G_TEXT, NONE,   NORMAL,   0L,          0, 2, 0, 1,
  34.      6, -1, -1, G_TEXT, NONE,   NORMAL,   0L,          0, 3, 0, 1,
  35.      7, -1, -1, G_TEXT, NONE,   NORMAL,   0L,          0, 4, 0, 1,
  36.      8, -1, -1, G_TEXT, NONE,   NORMAL,   0L,          0, 5, 0, 1,
  37.      9, -1, -1, G_TEXT, NONE,   NORMAL,   0L,          0, 6, 0, 1,
  38.     10, -1, -1, G_TEXT, NONE,   NORMAL,   0L,          0, 7, 0, 1,
  39.     11, -1, -1, G_TEXT, NONE,   NORMAL,   0L,          0, 8, 0, 1,
  40.     12, -1, -1, G_TEXT, NONE,   NORMAL,   0L,          0, 9, 0, 1,
  41.     13, -1, -1, G_TEXT, NONE,   NORMAL,   0L,          0,10, 0, 1,
  42.     14, -1, -1, G_TEXT, NONE,   NORMAL,   0L,          0,11, 0, 1,
  43.     15, -1, -1, G_TEXT, NONE,   NORMAL,   0L,          0,12, 0, 1,
  44.     16, -1, -1, G_TEXT, NONE,   NORMAL,   0L,          0,13, 0, 1,
  45.     17, -1, -1, G_TEXT, NONE,   NORMAL,   0L,          0,14, 0, 1,
  46.     18, -1, -1, G_TEXT, NONE,   NORMAL,   0L,          0,15, 0, 1,
  47.     19, -1, -1, G_TEXT, NONE,   NORMAL,   0L,          0,16, 0, 1,
  48.     20, -1, -1, G_TEXT, NONE,   NORMAL,   0L,          0,17, 0, 1,
  49.     21, -1, -1, G_TEXT, NONE,   NORMAL,   0L,          0,18, 0, 1,
  50.      1, -1, -1, G_TEXT, LASTOB, NORMAL,   0L,          0,19, 0, 1,
  51. };
  52.  
  53. #define TEXT_BOX        1
  54. #define FIRST_TEXT_LINE 2
  55.  
  56. /**************************************************************************
  57.  * treeplace - Figure out a good place to hang the text box on the screen.
  58.  *************************************************************************/
  59.  
  60. static void treeplace(ptree, vdirect)
  61.     register OBJECT *ptree;
  62.     register VRECT  *vdirect;
  63. {
  64.     register int    wrkint1, wrkint2, wrkint3;
  65.  
  66.     wrkint1 = vdirect->v_y1;
  67.     wrkint2 = gl_vwout[1] - vdirect->v_y2;
  68.     wrkint3 = ptree->ob_height + gl_hchar + 1;
  69.  
  70.     if (wrkint1 > wrkint2) {
  71.         ptree->ob_y = wrkint1 - wrkint3;        /* place above object */
  72.     } else {
  73.         ptree->ob_y = vdirect->v_y2 + gl_hchar; /* place below object */
  74.     }
  75.     
  76.     wrkint1 = vdirect->v_x1;
  77.     wrkint2 = gl_vwout[0] - vdirect->v_x2;
  78.     wrkint3 = ptree->ob_width + gl_wchar + 1;
  79.  
  80.     if (wrkint1 > wrkint2) {
  81.         ptree->ob_x = wrkint1 - wrkint3;
  82.     } else {
  83.         ptree->ob_x = vdirect->v_x2 + gl_wchar;
  84.     }
  85.     
  86.     frm_confine(ptree, &gl_rwdesk);
  87. }
  88.  
  89. /**************************************************************************
  90.  *
  91.  * frm_eflag - Flag an erronious object.
  92.  *
  93.  *************************************************************************/
  94.  
  95. int frm_eflag(ptree, obj, fmt)
  96.     OBJECT *ptree;
  97.     int     obj;
  98.     char    *fmt;
  99. {
  100.     va_list     args;
  101.     int         dmy;
  102.     int         vdi_handle;
  103.     int         maxwidth = 0;
  104.     int         numlines;
  105.     int         msglen;
  106.     void        *blitbuffer;
  107.     char        *pmsgtext;
  108.     char        *msglines[FRM_DSMAXSTRINGS+1];
  109.     GRECT       flagrect;
  110.     GRECT       msgrect;
  111.     GRECT       saverect;
  112.     VRECT       flagbox;
  113.     XMULTI      xm;
  114.     static int  initdone = FALSE;
  115.  
  116.     /*----------------------------------------------------------------------
  117.      * Start by ringing the user's bell <snicker>.  Believe it or not,
  118.      * doing this first helps hide the fact that it takes about 1/4 second
  119.      * to get the error display up on the screen.   (Don't ask me why, do
  120.      * I look like a psychologist or something?)
  121.      *--------------------------------------------------------------------*/
  122.  
  123.     Bconout(2,'\007');                                   /* ding...       */
  124.  
  125.     if (!initdone) {
  126.         initdone = TRUE;
  127.         rsc_treefix(msgtree);
  128.         msgtree[TEXT_BOX].ob_y = gl_hchar / 2;
  129.     }
  130.     
  131.     if (0 == (vdi_handle = apl_vshared())) {
  132.         goto ERROR_EXIT;
  133.     }
  134.  
  135.     /*----------------------------------------------------------------------
  136.      * Calc the rectangles involved with the object to be flagged.
  137.      *--------------------------------------------------------------------*/
  138.  
  139.     obj_clcalc(ptree, obj, &flagrect, NULL);
  140.     rc_gadjust(&flagrect, 5, 3);
  141.     rc_gtov(&flagrect, &flagbox);
  142.  
  143.     /*----------------------------------------------------------------------
  144.      * Fix up the error message text tree.  The fixup will change the
  145.      * size of the tree. Upon return, calc the location of the tree, (note
  146.      * that this process can fail, if we can't fit the text on the screen).
  147.      * Calc rectangles involved with the final placement of the text tree.
  148.      *--------------------------------------------------------------------*/
  149.  
  150.     va_start(args, fmt);
  151.     pmsgtext = _FrmVFormat(fmt, args, &msglen);
  152.     va_end(args);
  153.     
  154.     if (msglen == -1) {
  155.         goto ERROR_EXIT;
  156.     }
  157.  
  158.     _FrmNL2DS(pmsgtext, msglines, NULL, FRM_DSMAXSTRINGS);
  159.     numlines = _FrmDS2Obj(msglines, &msgtree[FIRST_TEXT_LINE], NULL, 
  160.                             &maxwidth, FRM_DSMAXSTRINGS);
  161.                             
  162.     _FrmTrWidths(msgtree, TEXT_BOX, gl_wchar * maxwidth);
  163.     msgtree[TEXT_BOX].ob_height = gl_hchar * numlines;
  164.  
  165.     msgtree[ROOT].ob_width  = gl_wchar * (maxwidth + 2);
  166.     msgtree[ROOT].ob_height = gl_hchar * (numlines + 1);
  167.  
  168.     treeplace(msgtree, &flagbox);
  169.  
  170.     obj_clcalc(msgtree, ROOT, &msgrect, NULL);
  171.     rc_copy(&msgrect,  &saverect);
  172.     rc_union(&flagrect, &saverect);
  173.     rc_gadjst(&saverect, 3, 2);
  174.  
  175.     /*----------------------------------------------------------------------
  176.      * Save the screen area, display the text message and flag the
  177.      * object.  Wait for a button or key, upon event restore the screen.
  178.      *--------------------------------------------------------------------*/
  179.  
  180.     wind_update(BEG_MCTRL);
  181.     wind_update(BEG_UPDATE);
  182.     
  183.     if (NULL == (blitbuffer = grf_memblit(GRF_NORMAL, NULL, &saverect)))
  184.         goto ERROR_EXIT;
  185.         
  186.     graf_mouse(M_OFF, 0L);
  187.     vsl_width(vdi_handle, 3);
  188.     vsl_color(vdi_handle, 2);                           /* red */
  189.     vs_clip(vdi_handle, TRUE, &gl_rfscrn);
  190.     v_rbox(vdi_handle, &flagbox);                      /* flag object */
  191.     vs_clip(vdi_handle, FALSE, &gl_rfscrn);
  192.     vsl_color(vdi_handle, 1);
  193.     vsl_width(vdi_handle, 1);
  194.     graf_mouse(M_ON, 0L);
  195.     
  196.     objc_draw(msgtree, R_TREE, MAX_DEPTH, msgrect); /* show text  */
  197.     
  198.     xm.mflags   = MU_BUTTON | MU_KEYBD;
  199.     xm.mbclicks = 1;
  200.     xm.mbmask   = 1;
  201.     xm.mbstate  = 1;
  202.     
  203.     evnx_multi(&xm);
  204.  
  205.     grf_memblit(GRF_NORMAL, blitbuffer, &saverect);
  206.  
  207.     if (xm.mwhich & MU_BUTTON) {
  208.         xm.mbstate = 0;              /* wait for button-up */
  209.         xm.mflags  = MU_BUTTON;
  210.         evnx_multi(&xm);
  211.     }
  212.  
  213.     wind_update(END_UPDATE);
  214.     wind_update(END_MCTRL);
  215.  
  216.     _FrmVFree(pmsgtext);
  217.  
  218.     /*----------------------------------------------------------------------
  219.      * return success.
  220.      *--------------------------------------------------------------------*/
  221.  
  222.     return 0;
  223.     
  224. ERROR_EXIT:
  225.             
  226.     form_alert(1,cant_flagit_alert);
  227.     return -1;
  228. }
  229.  
  230.